package org.quincy.rock.core.dao.sql;

import java.io.Serializable;

import org.quincy.rock.core.dao.NameInterceptor;
import org.quincy.rock.core.dao.ValueInterceptor;

/**
 * <b>Expression。</b>
 * <p><b>详细说明：</b></p>
 * <!-- 在此添加详细说明 -->
 * 无。
 * 
 * @version 1.0
 * @author mex2000
 * @since 1.0
 */
public interface Expression extends Serializable {

	/**
	 * <b>设置name拦截器。</b>
	 * <p><b>详细说明：</b></p>
	 * <!-- 在此添加详细说明 -->
	 * 无。
	 * @param <T>
	 * @param nameInterceptor name拦截器
	 * @return name
	 */
	public <T extends Expression> T nameInterceptor(NameInterceptor nameInterceptor);

	/**
	 * <b>获得name拦截器。</b>
	 * <p><b>详细说明：</b></p>
	 * <!-- 在此添加详细说明 -->
	 * 无。
	 * @return name拦截器
	 */
	public NameInterceptor nameInterceptor();

	/**
	 * <b>构建字符串表达式。</b>
	 * <p><b>详细说明：</b></p>
	 * <!-- 在此添加详细说明 -->
	 * 无。
	 * @param buffer 字符串缓冲区
	 * @param nameInterceptor name拦截器
	 * @return 返回buffer
	 */
	default StringBuilder build(StringBuilder buffer, NameInterceptor nameInterceptor) {
		return build(buffer, nameInterceptor, ValueInterceptor.NOOP);
	}

	/**
	 * <b>构建字符串表达式。</b>
	 * <p><b>详细说明：</b></p>
	 * <!-- 在此添加详细说明 -->
	 * 无。
	 * @param buffer 字符串缓冲区
	 * @param nameInterceptor name拦截器
	 * @param valueInterceptor 值拦截器
	 * @return 返回buffer
	 */
	public StringBuilder build(StringBuilder buffer, NameInterceptor nameInterceptor,
			ValueInterceptor valueInterceptor);

	/**
	 * <b>获得SQL片段。</b>
	 * <p><b>详细说明：</b></p>
	 * <!-- 在此添加详细说明 -->
	 * 无。
	 * @return SQL片段
	 */
	default String getSqlFragment() {
		return build(new StringBuilder(), nameInterceptor(), (value, dt, match) -> "?").toString();
	}
}
